#include<filesystem>
#include<nlohmann/json.hpp>
#include<unordered_map>
#include<MsgType.h>
#include<deque>
#include<vector>
#include<unordered_map>
#include "ChatRoomErr.h"

using json=nlohmann::json;

class ChatRoom{
    private:
    int owner_id; //聊天室所有者id
    string chat_id;//聊天室id
    string chat_name;//聊天室名称
    map<int,string> user_list;//聊天室用户列表
    deque<shared_ptr<Msg>> chat_history;//聊天记录

    constexpr static int MSG_MAX_SIZE=1000; //聊天记录最大容量

    public:
    //将聊天室信息序列化为json，用于文件存储
    json serialize()const ;

    //从json反序列化聊天室信息，用于文件读取
    void unserialize(const json&j);

    ChatRoom(const int&owner_id,const string&chat_id,const string&chat_name):owner_id(owner_id),chat_id(chat_id),chat_name(chat_name){
    }
    ChatRoom()=default;

    int get_owner_id() const;
    string get_chat_id() const;
    string get_name() const;
    map<int,string> get_user_list() const;
    deque<shared_ptr<Msg>> get_chat_history() const;

    //向聊天室添加用户
    bool add_user(const int&user_id,const string&user_name);

    //从聊天室中移除用户
    bool remove_user(const int&user_id);

    //判断是否为所有者
    bool is_owner(const int&user_id) const;

    bool is_user_in_room(const int&user_id) const;

    //向聊天室添加聊天记录
    void add_chat_msg(const shared_ptr<Msg>msg);

    deque<shared_ptr<Msg>> get_latest_chat_msg(const int&num_msg) const;

    int get_chat_history_size() const;

    shared_ptr<Msg> get_a_msg(int index);
};
